|
(******************************************************************************)
(**) ОТДЕЛ ПроLU+;
(******************************************************************************
* НАЗНАЧЕНИЕ:
* решение систем линейных уравнений (A*x=b) методом LU-разложения
*
* ПРИМЕЧАНИЯ:
* Система уравнений записана в файле "ПроМатр2.дан".
* В этом файле 1-я строка содержит размер матрицы A
* (число строк и столбцов), в следующих строках записанны значения элементов
* матрицы A, потом на отдельной строке размер матрицы свободных членов B
* (число векторов b и их размер), а далее значения элементов матрицы B,
* в которой строки являются векторами b.
*
* Квадратная матрица A (N на N) раскладывается на два сомножителя (A=L*U),
* где L это нижняя треугольная матрица с единичной главной диагональю,
* а U верхняя треугольная матрица. Затем решаются две системы уравнений
* L*z=b и U*x=z с использованием того преимущества, что матрицы этих систем
* являются треугольными.
******************************************************************************)
ИСПОЛЬЗУЕТ
Матр ИЗ "...\Отделы\Числа\",
МатрВВ ИЗ "...\Отделы\Числа\",
Читать ИЗ "...\Отделы\Обмен\",
Вывод ИЗ "...\Отделы\Обмен\";
(******************************************************************************)
ЗАДАЧА Голова;
ПЕР
n:ЦЕЛ; (* размер вектора свободных членов *)
nv:ЦЕЛ; (* число векторов свободных членов *)
A:Матр.Доступ; (* матрица системы *)
B:Матр.Доступ; (* вектора свободных членов *)
X:Матр.Доступ; (* вектора решения *)
p:Матр.Перестановки; (* перестановки для обратного хода *)
i:ЦЕЛ;
п:Читать.Поток;
УКАЗ
п:=МатрВВ.ОткрытьПоток("ПроМатр2.дан");
A:=МатрВВ.ЧитатьМатр(п);
B:=МатрВВ.ЧитатьМатр(п);
Читать.Закрыть(п);
nv:=РАЗМЕР(B^,0);
n:=РАЗМЕР(B^,1);
СОЗДАТЬ(X,nv,n);
Вывод.Цепь("^Исходная матрица:^");
МатрВВ.ВыводМатр("%10.5f",A^);
Вывод.Цепь("^Вектора свободных членов:^");
ОТ i:=0 ДО nv-1 ВЫП
МатрВВ.ВыводВект("%10.5f",B[i])
КОН;
(* После выполнения РазложитьНаLU матрицы L и U оказываются на месте матрицы A *)
ЕСЛИ Матр.РазложитьНаLU(A^,p) = 0 ТО
(* решаем систему для каждого вектора свободных членов b *)
Вывод.Цепь("^Вектора решения:^");
ОТ i:=0 ДО nv-1 ВЫП
Матр.РешитьИзLU(A^,B[i],p,X[i]);
МатрВВ.ВыводВект("%10.5f",X[i])
КОН
ИНАЧЕ
Вывод.Цепь("^Вырожденная матрица!^")
КОН
КОН Голова;
(******************************************************************************)
УКАЗ
Голова
КОН ПроLU.
▲ Вопросы, замечания и предложения высылайте на atimopheyev@yahoo.com или Издателю Глагола:
|
|